package com.bingquan.company.servilizable;

import java.io.*;

/**
 * 那么什么情况下需要序列化呢?大概有这样两类比较常见的场景：
 * 1、需要把内存中的对象状态数据保存到一个文件或者数据库中的时候，这个场景是比较常见的，例如我们利用mybatis框架编写持久层insert对象数据到数据库中时
 * 2、网络通信时需要用套接字在网络中传送对象时，如我们使用RPC协议进行网络通信时
 * ————————————————
 * 版权声明：本文为CSDN博主「xiaoshijiu333」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
 * 原文链接：https://blog.csdn.net/shijiujiu33/article/details/90344915
 * <p>
 * 如果不继承serializable接口，就不能使用java.io中的objectOutputStream/objectInputStream
 */
public class User implements Serializable {

    /**
     * 在实现序列化接口的时候，我们一般显式的给serialVersionUID设置一个固定值。这样无论类后期增加成员变量还是删除成员变量，都不会发生错误。
     * <p>
     * 如果在实现序列化接口的时候，没有显式指定一个固定值，java序列化机制是会自动生成一个serialVersionUID，
     * 这个自动值会受类名称、它所实现的接口、以及所有的共有的私有的和受保护的成员变量的影响。如果这些值改变，那么这个自动值也会改变。在反序列化时，便会出错。
     */
    private static final long serialVersionUID = 2L;


    private String userId;
    private String userName;

    public User(String userId, String userName) {
        this.userId = userId;
        this.userName = userName;
    }
}

class SerializableTest {

    /**
     * 将User对象作为文本写入磁盘
     */
    public static void writeObj() {
        User user = new User("1001", "Joe");
        try {
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\/user.txt"));
            objectOutputStream.writeObject(user);
            objectOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String args[]) {
        writeObj();
    }
}

class SerializableTest2 {
    /**
     * 将类从文本中提取并赋值给内存中的类
     */
    public static void readObj() {
        try {
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("D:\\/user.txt"));
            try {
                Object object = objectInputStream.readObject();
                User user = (User) object;
                System.out.println(user);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void main(String args[]) {
        readObj();
    }
}